package com.gitee.faster.webdav.kernel.resource;

import com.gitee.faster.webdav.common.structure.RangeValue;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * 资源库
 * 提供资源的常用方法接口
 *
 * @author hongda.li
 */
public interface ResourceRepository<R extends Resource> {

    /**
     * 对于给定的路径，是否接受处理
     *
     * @param requestPath 请求路径
     * @return 是否接受
     */
    boolean accept(String requestPath);

    /**
     * 将请求路径转为资源
     *
     * @param requestPath 请求路径
     * @return 创建结果
     */
    R transform(String requestPath);

    /**
     * 获取根目录
     *
     * @return 根目录
     */
    R getRoot();

    /**
     * 获取父资源
     * 如果父资源不存在应该返回空资源
     *
     * @return 父资源
     */
    R getParent(R resource);

    /**
     * 创建目录
     *
     * @param resource 资源
     */
    void mkdir(R resource);

    /**
     * 删除文件或目录
     * 如果是目录则递归删除目录下的文件
     *
     * @param resource 资源
     */
    void delete(R resource);

    /**
     * 递归查询资源
     *
     * @param resource 根资源
     * @param depth    递归深度
     * @return 查询结果
     */
    List<R> walk(R resource, int depth);

    /**
     * 上传文件
     *
     * @param resource 待上传资源
     * @param input    待上传数据
     */
    void upload(R resource, InputStream input);

    /**
     * 全量下载文件
     *
     * @param resource 待下载资源
     * @param output   响应流
     */
    void download(R resource, OutputStream output);

    /**
     * 分段下载文件
     *
     * @param resource 待下载资源
     * @param output   响应流
     * @param range    范围值
     */
    void downloadPart(R resource, OutputStream output, RangeValue range);
}
